package com.luxsoft.siipap.em.replica.online;

import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.luxsoft.siipap.em.replica.model.Campo;
import com.luxsoft.siipap.em.replica.model.Registro;

/**
 * Transofra un String a un bean {@link Registro}. El String debe ser
 * en el formato definido por el sistema de replica de siipap DBF
 * 
 * @author Ruben Cancino
 *
 */
public class TransformadorARegistros {
	
	private Logger logger=Logger.getLogger(getClass());
	
	public Registro transformar(final String registroAsString){
		
		String[] partes=StringUtils.splitPreserveAllTokens(registroAsString, '[');//registroAsString.split("[");
		if(partes.length==10){
			final Registro r=new Registro();
			r.setArchivo(partes[0]);
			r.setTipo(partes[1]);
			r.setLlave(partes[2]);
			String[] indices=StringUtils.split(partes[3], '[');
			r.setIndices(indices);
			r.setIndiceUso(toInteger(partes[4]));
			r.setCampos(resolverCampos(partes[5]));
			r.setTempo1(partes[6]);
			r.setAlias(partes[7]);
			r.setTipoArchivo(partes[8]);
			r.setYear(toInteger(partes[9]));
			if(logger.isDebugEnabled()){
				logger.info("Registro generado:"+r);
			}
			return r;
		}else{
			String msg=MessageFormat.format("El formato del registro consta de {0} secciones no de 10  por lo que no es importable. Registro: {1}",partes.length,ArrayUtils.toString(partes));
			throw new RuntimeException(msg);
		}
		
	}
	
	private int toInteger(final String val){
		try {
			String r=String.valueOf(StringUtils.trimToEmpty(val));
			return Integer.valueOf(r);
		} catch (Exception e) {
			return 0;
		}
	}
	
	private Set<Campo> resolverCampos(String val){
		String[] cm=StringUtils.split(val, "|");
		Set<Campo> campos=new HashSet<Campo>();
		for(String c:cm){
			try {
				Campo campo=new Campo(c);
				campos.add(campo);
			} catch (Exception e) {
				logger.info(e.getMessage());
			}
		}
		return campos;
	}

}
